<?php
class IndexAction extends Action{
    protected  $jsStr = '';
    protected  $cssStr = '';
    protected  $common_file_dir = 'tpl/Web/resource/fun/';
    protected  $common_file_suffix = '.php';
    protected  $common_file_path = 'tpl/Web/resource/fun/common.php';
    //web_page表存储 页面模板 和 模板要调用的函数 这个就会产生最终的效果
    public function index(){
        //逻辑关系
        //根据从url中传入进来的参数 进入到一相应的页面  一个页面是由 栏目 + 系统模型 + 页面类型  确定的
        //由于系统模型是在栏目那里就可以确定了  所以 只要栏目和 页面类型 就可以确定一个页面 该调用哪一个
        //menu  model  type
        $menu = $_GET['mid'];
        $pagetype = $_GET['pagetype'];
        $token = $_GET['token'];

        import('ORG.Wjbweb.WebData');

        WebData::$web_name = WEB_NAME;
        if($_GET['mid'] == 0){// 首页
            WebData::$web_keywords = WEB_KEYWORDS;
            WebData::$web_description = WEB_DESCRIPTION;
        }else{
            $webinfo = M('web_domain')->where(array('token'=>$token))->find();
            WebData::$web_name = $webinfo['webname'];
            //WebData::$web_keywords = $webinfo['webkeywords']; 分页不需要
            //WebData::$web_description = $webinfo['webdescription'];
        }

        $template =  $this->getTemplate($token,$menu,$pagetype);  //系统模型可以通过栏目得到
        $template = $this->preprocessTemplate($template);
        $this->parseTemplate($template,$token,$menu);

        //seo
        $web_name = WebData::$web_name;
        $web_keywords = WebData::$web_keywords;
        $web_description = WebData::$web_description;
        $web_style = WebData::$web_style;

        $str = <<<COD
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html>
             <head>
               <title>{$web_name}</title>
               <meta name="keywords" content="{$web_keywords}" />
               <meta name="description" content="{$web_description}" />
               <style type="text/css">
                     body{ margin:0;padding:0;}
                     dl,dd,ul,li{ padding:0; border:none; margin:0;}
                     li{ list-style:none;}
                     img{ display:block; border:none;}
                     input{ border:none; margin:0; padding:0;}
                     p{ border:none; margin:0;}
                     a{ font-size:12px; text-decoration:none;}
                     td{vertical-align:top;}
                     table{border-collapse:collapse;border-spacing:0;border:0px solid black;padding:0px;margin:0px;}
                     td{border:0px solid black;padding-top:0px;padding-bottom:0px;padding-left:0px;}
               </style>
               {$web_style}
               <script type="text/javascript" src="/tpl/Web/resource/js/modeljs.js?v=<?php echo time();?>"></script>
               {$this->jsStr}{$this->cssStr}

             </head>
             <body style="margin:0 auto;">
                {$template['template']}
             </body>
            </html>
COD;

        //处理页面中style  将style都放到头部去
//        $res = preg_match_all('/(<\s*style[^>]*>(?:[\s\S]*)<\s*\/style\s*>)/',$str,$matches);
//        var_dump($matches);exit;  这个方法不行 因为赋值是在下面的语句当中 上面的字符串没有用
//        所以要用静态参数 像meta的数据处理的那样  在模块当中赋值  在最后的时候调用 这个更加简单方便
//        但是这个放在后台编辑的时候 会出现一定的问题  因为后台是通过ajax的方式加载的



        $this->show($str);
    }

    /*
     * 这个是没有用的吧
     */
    public function edit(){
        $menu = $_GET['menu'];
        $pagetype = $_GET['pagetype'];
        $token = $_GET['token'];

        $template = $this->getTemplate($token,$menu,$pagetype);
        //获取模板展现的方式同上
        //获取编辑的js代码 通过js将编辑后的模板保存到数据库中
    }

    public function getTemplate($token,$menu,$pagetype){//找到模板
        $res =  M('web_page')->where(array('cid'=>$menu,'pagetype'=>$pagetype,'token'=>$token))->find();
        //301页面
        if( !$res ){
            header('http/1.1 301 Moved Permanently');
            header('Location: http://'.$_SERVER['HTTP_HOST']);
        }

//        echo $menu.':'.$pagetype;
//        var_dump($res);exit;
//        //var_dump($res);
        $return['template'] = $res['template'];
        $return['funlist'] = $res['funlist'];
        return $return;
    }


    /**
     * 这个函数需要根据情况来对待  根据以后的排版模块来对待 目前可以暂定成这样
     * @param $template
     * @return mixed
     */
    public function preprocessTemplate($template){
        //preg_match_all('/<table[^>]*>/',$template['template'],$ceshi);
        //exit(var_dump($ceshi));
        $template['template'] = preg_replace(array('/<table[^>]*>/','/<td[^>]*(style="[^"]*")[^>]*>/'),array('<table style="width:100%;">','<td $1>'),$template['template']);
        return $template;
    }

    //$key不要是模块名了 不要做函数名调用，key最好是标签名  如果key是标签名 那么最好参数的第一个是就模块名
    public function parseTemplate($template,$token,$menu){

        $args = unserialize($template['funlist']);
        $modelList = array();


        import('ORG.Wjbweb.ModelArg');
        $modelArg = new ModelArg();

        //考虑每个模块要引用的文件
        foreach($args as $key => $val ){
            //$return = $key($val);
            //$key 是标签名，$val['name'] 是模块名
            //要先判断文件是否存在
            require_once $this->common_file_path;
            require_once $this->common_file_dir.$val['name'].$this->common_file_suffix;
            $modelObject = new $val['name']();
            array_push($modelList,$val['name']); //用户分析需要加载哪些文件
            $specialArgs = $modelArg -> parseArgs($_GET,$_POST,$val['name'],$key);//看看是否有特殊的参数
            $val['args'] = $this->processArgsForShow($val['args']);//参数处理 主要是htmlspecialchars
            $return = $modelObject->show($val['args'],$key,$val['name'],$specialArgs);// 标签=>array('name'=>'函数名','args'=>array())//第二个数组就是参数
            $this->assign($key,$return);
        }

        $this->parseFile($modelList);
    }

    /**
     * @param $modelList 模块数组
     */
    public function parseFile($modelList){

        $modelListStr = '';
        foreach($modelList as $val ){

            $modelListStr .= '\''.$val.'\',';
        }

        if($modelListStr) {
            $modelListStr = trim($modelListStr,',');
            $res = M('web_model')->where('name in (' . $modelListStr . ')')->select();
            //去除为空的 将js和css文件都提取出来  重复的文件都去掉了 排序以最后一个出现的为准
            $fileConfig = array('js'=>array(),'css'=>array());
            foreach($res as $v){
                if($v){
                    $fileList = unserialize($v['file']);
                    if($fileList['js']){
                        foreach($fileList['js'] as $js=>$index){
                            $fileConfig['js'][$js] = $index;
                        }
                    }
                    if($fileList['css']){
                        foreach($fileList['css'] as $css => $index){
                            $fileConfig['css'][$css] = $index;
                        }
                    }
                }
            }

            //将js 文件 和css  文件 直接生成相应的网页字符串  首先要排序  排序首先要改变数组结构

            $jsArr = array();
            foreach($fileConfig['js'] as $key => $val ){
                array_push($jsArr,array($key,$val));
            }
            $cssArr = array();
            foreach($fileConfig['css'] as $key => $val ){
                array_push($cssArr,array($key,$val));
            }


            $jsArr = $this->quickSort($jsArr);
            $cssArr = $this->quickSort($cssArr);


            $jsStr = '';
            foreach( $jsArr as $val ){
                $jsStr .= '<script type="text/javascript" src="'.$val[0].'"></script>';
            }
            $cssStr = '';
            foreach( $cssArr as $val ){
                $cssStr .= '<link rel="stylesheet" type="text/css" href="'.$val[0].'" />';
            }

//            $this->assign('jsStr',$jsStr);
//            $this->assign('cssStr',$cssStr);
            $this->jsStr = $jsStr;
            $this->cssStr = $cssStr;

        }


    }

    /**
     * @param $arr $arr的形式是这样的  'file'=>index 得改改形式 改成  index =>array('file','fileindex')
     * @return array
     */
    public function quickSort($arr)
    {
        if (count($arr) > 1) {
            $k = $arr[0][1];
            $x = array();
            $y = array();
            $_size = count($arr);
            for ($i = 1; $i < $_size; $i++) {
                if ($arr[$i][1] <= $k) {
                    $x[] = $arr[$i];
                } elseif ($arr[$i][1] > $k) {
                    $y[] = $arr[$i];
                }
            }
            $x = $this->quickSort($x);
            $y = $this->quickSort($y);
            return array_merge($x, array(array($arr[0][0],$arr[0][1])), $y);
        } else {
            return $arr;
        }
    }


    /**
     * @param $args array 用于处理模块配置的args参数  目前只需要将字符串从htmlspecialchars 转到正常的html代码
     */
    private function processArgsForShow($args){
        foreach( $args as $key => $val ){
            if( is_string($val) ){
                $args[$key] = htmlspecialchars_decode($val);
            }
        }
        return $args;
    }

    /**
     * @param $args array  与上一个函数 一个是保存用 一个是取出用
     */
    private function processArgsForSave($args){
        foreach( $args as $key => $val ){
            if( is_string($val) ){
                $args[$key] = htmlspecialchars($val);
            }
        }
        return $args;
    }


}
